<html>
  <head>
    <title>覆盖页面</title>
  </head>
  <body>
    <script>
       //  自定义UI  概览

            /*
                  文档解释了任何为asp.net core razor 页面应用程序"覆盖依赖" 的"应用程序模块" 或 "主题" 的用户交互界面 
            */

            /*
                一、覆盖页面

                          本节介绍 Razor Pages 开发，这是为Asp.net core 创建服务器陈轩用户交互界面的推荐方法。

                          预构建模块通常使用Razor pages方式，而不是典型的MVC模式。


                          你通常对页面有三种覆盖要求：

                                ①、覆盖"页面模型（C#）"端以执行附加逻辑而不更改页面UI

                                ②、仅覆盖Razor Page (.chtml文件)以更改UI，而不更改页面后面的模型(C#)

                                ③、完全覆盖页面


                          1、覆盖页面模型（C#）

                                          using System.Threading.Tasks;
                                          using Microsoft.AspNetCore.Mvc;
                                          using Volo.Abp.DependencyInjection;
                                          using Volo.Abp.Identity;
                                          using Volo.Abp.Identity.Web.Pages.Identity.Users;

                                          namespace Acme.BookStore.Web.Pages.Identity.Users
                                          {
                                              [Dependency(ReplaceServices = true)]  // 替换实现
                                              [ExposeServices(typeof(EditModalModel))]  // 暴露服务
                                              public class MyEditModalModel : EditModalModel
                                              {
                                                  public MyEditModalModel(
                                                      IIdentityUserAppService identityUserAppService,
                                                      IIdentityRoleAppService identityRoleAppService
                                                      ) : base(
                                                          identityUserAppService,
                                                          identityRoleAppService)
                                                  {
                                                  }

                                                  public async override Task<IActionResult> OnPostAsync()
                                                  {
                                                      //TODO: Additional logic
                                                      await base.OnPostAsync();
                                                      //TODO: Additional logic
                                                  }
                                              }
                                          }

                                          此类继承并替换用户的EditModalModel，并覆盖OnPostAsync方法以在底层代码之前和之后执行附加逻辑。

                                          它使用ExposeServices和Dependency属性来替换类。


                                
                        2、覆盖Razor页面   (.cshtml)

                                        通过在同一路径下创建新的.cshtml文件，可以覆盖.cshtml文件。
                                        
                                        
                                        eg:
                                              此示例覆盖由帐户模块定义的登录页面UI。

                                              帐户模块在Pages/Account文件夹下定义了一个Login.cshtml文件。
                                              
                                              因此，您可以通过在同一路径中创建一个文件来覆盖它：

                                                "Pages/Account/Login.cshtml"

                                              你通常希望复制模块原始的 .cshtml文件，然后进行必要的更改。

                                              你可以在此处找到原始文件。

                                              不要赋值Login.cshtml文件，这是Razor页面的代码文件，我们还不想覆盖它。

                                               （如果要覆盖的页面包含ABP标记助手，请不要忘记添加_ViewImports. cshtml。）
                                               
                                                      @addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
                                                      @addTagHelper *, Volo.Abp.AspNetCore.Mvc.UI
                                                      @addTagHelper *, Volo.Abp.AspNetCore.Mvc.UI.Bootstrap
                                                      @addTagHelper *, Volo.Abp.AspNetCore.Mvc.UI.Bundling

                                              就是这么简单，你可以随意更改文件内容。


                        3、完全覆盖剃刀页面

                                         你可能希望完全覆盖页面： Razor 页面与页面相关的C#文件。
                                         
                                         在这种情况下：

                                              ①、就像上面描述的那样覆盖页面模型类，但不要替换现有的页面模型类。

                                              ②、覆盖上面描述的Razor页面，但也更改@model指令以指向您的新页面模型。


                                        eg:  示例  此示例覆盖由帐户模块定义的登录页面。

                                              创建从LoginModel派生的页面模型类  在Volo.Abp.Account.Web.Pages.Account命名空间中定义）：

                                              （   如果您使用的是AbpAccountWebOpenIddictModule或AbpAccountPublicWebOpenIddictModule，
                                                
                                                   则基类是OpenIddictSupportedLoginModel而不是LoginModel。
                                                   
                                                   您应该将ExposeServices属性更改为[ExposeServices(typeof (MyLoginModel), typeof(OpenIddictSupportedLoginModel), typeof(LoginModel))]
                                                  
                                                ）

                                                        [ExposeServices(typeof (MyLoginModel), typeof(LoginModel))]
                                                        public class MyLoginModel : LoginModel
                                                        {
                                                            public MyLoginModel(
                                                                IAuthenticationSchemeProvider schemeProvider,
                                                                IOptions<AbpAccountOptions> accountOptions
                                                                ) : base(
                                                                schemeProvider,
                                                                accountOptions)
                                                            {

                                                            }
   
                                                            public override Task<IActionResult> OnPostAsync(string action)
                                                            {
                                                                // 添加逻辑
                                                                return base.OnPostAsync(action);
                                                            }

                                                            //TODO: Add new methods and properties...
                                                        }

                                                如果需要，您可以覆盖任何方法或添加新的属性/方法。

                                                如上所述，将Login.cshtml文件复制到您的解决方案中。更改@model指令以指向MyLoginModel：

                                                         @page
                                                          ...
                                                          @model Acme.BookStore.Web.Pages.Account.MyLoginModel
                                                          ...      
                                                          
                                                          
                                                就是这么简单，在视图中进行任何更改并运行你的应用程序。



                                        ★、无需继承即可替换页面模型

                                                        你不必就从原始页面模型继承（就像前面的示例中所做的那样）。

                                                        相反，你可以自己完全重新实现页面。
                                                        
                                                        在这种情况下，只需要从 PageModel、AbpPageModel 或者你需要的任何适合的基类派生。
            */
    </script>
  </body>
</html>